package fr.ajicommerce.core.service.implementation;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import fr.ajicommerce.core.dao.interfaces.ICategorieDAO;
import fr.ajicommerce.core.dto.CategorieDTO;
import fr.ajicommerce.core.dto.PhotoDTO;
import fr.ajicommerce.core.dto.ProduitDTO;
import fr.ajicommerce.core.entities.Categorie;
import fr.ajicommerce.core.entities.Photo;
import fr.ajicommerce.core.entities.Produit;
import fr.ajicommerce.core.service.generics.GenericService;
import fr.ajicommerce.core.service.interfaces.CategorieService;

@Component("categorieServiceImpl")
@Transactional
public class CategorieServiceImpl  extends GenericService<CategorieDTO, Categorie>
implements CategorieService{
	
	public CategorieServiceImpl(Class<Categorie> clazzOfA,
			Class<CategorieDTO> entityClassT) {
		super(clazzOfA, entityClassT);
	}

	public CategorieServiceImpl() {
		super(Categorie.class, CategorieDTO.class);
	}

	@Autowired
	ICategorieDAO categorieDAO;

	// surcharge de save existant dans AbstractService
	@Override 
	public void save(CategorieDTO cDTO) {
		// System.out.println("save CategorieDTO copier les listes produits.");
		Categorie a = new Categorie();
		ArrayList<Produit> lp = new ArrayList<Produit>();
		List<ProduitDTO> lpDto = cDTO.getProduitsDTO();
		
		BeanUtils.copyProperties(cDTO, a);
		if (lpDto != null) {
			for (ProduitDTO prDto : lpDto) {
				Produit nProduit = new Produit();
				BeanUtils.copyProperties(prDto, nProduit);
				lp.add(nProduit);
				}
			}
		((Categorie)a).setProduits(lp);
		categorieDAO.save(a);
		BeanUtils.copyProperties(a, cDTO);
	}

	// surcharge de merge existant dans AbstractService
	@Override 
	public void merge(CategorieDTO cDTO) {
		// System.out.println("merge ProduitDTO copier les listes photos.");
		Categorie a = new Categorie();
		ArrayList<Produit> lp = new ArrayList<Produit>();
		List<ProduitDTO> lpDto = cDTO.getProduitsDTO();
		
		BeanUtils.copyProperties(cDTO, a);
		if (lpDto != null) {
			for (ProduitDTO prDto : lpDto) {
				Produit nProduit = new Produit();
				BeanUtils.copyProperties(prDto, nProduit);
				lp.add(nProduit);
				}
			}
		((Categorie)a).setProduits(lp);
		categorieDAO.merge(a);
		BeanUtils.copyProperties(a, cDTO);
	}

	public CategorieDTO find(Long idCategorie) {
		//TODO
		// recherche d'une Categorie selon l'id produit (1 categorie unique par produit)
			CategorieDTO dto = null;
			// transfert DAO --> DTO
			dto = new CategorieDTO();
			Categorie dao = categorieDAO.find(idCategorie);
			if (dao != null) {
				BeanUtils.copyProperties(dao, dto);
				
				ArrayList<ProduitDTO> lpDto = new ArrayList<ProduitDTO>();
				List<Produit> lp = dao.getProduits();
				if (lp != null) {
					for (Produit pr : lp) {
						ProduitDTO nProduitDTO = new ProduitDTO();
						BeanUtils.copyProperties (pr, nProduitDTO );
						lpDto.add(nProduitDTO);
						}
					}
			dto.setProduitsDTO(lpDto);
						
			}
		return dto;
	}
	
	@Override
	public CategorieDTO findCategorieByRef(String nom) {
		
		// recherche d'une Categorie selon son nom
		Categorie dao = categorieDAO.findCategorieByNom(nom);
		CategorieDTO dto = new CategorieDTO();

		ArrayList<ProduitDTO> lpDto = new ArrayList<ProduitDTO>();
		List<Produit> lp = dao.getProduits();
		
		if (lp != null) {
			for (Produit pr : lp) {
				ProduitDTO nProduitDTO = new ProduitDTO();
				BeanUtils.copyProperties (pr, nProduitDTO );
				lpDto.add(nProduitDTO);
				}
			}
		dto.setProduitsDTO(lpDto);

		// transfert DAO --> DTO
		BeanUtils.copyProperties(dao, dto);

		return dto;
	}

	@Override
	public List<CategorieDTO> findAllCategoriesByThisNom(String nom) {
		List<CategorieDTO> listDTO = new ArrayList<CategorieDTO>() ;
		List<Categorie> listeCategorie = categorieDAO.findCategoriesByThisNom (nom) ;
		
		if (listeCategorie == null) {
			return null;
		}
		
		for (Categorie c : listeCategorie)
		{
			CategorieDTO cDTO = new CategorieDTO();
			ArrayList<ProduitDTO> lpDto = new ArrayList<ProduitDTO>();
			List<Produit> lp = c.getProduits();
			
			for(Produit pr : lp) {
				ProduitDTO nProduitDTO = new ProduitDTO();
				BeanUtils.copyProperties (pr, nProduitDTO );
				lpDto.add(nProduitDTO);
				
			}

			cDTO.setProduitsDTO(lpDto);
			BeanUtils.copyProperties(c, cDTO);
			
			listDTO.add(cDTO);
			System.out.println("findAllCategoriesByThisNom cDTO :" + cDTO.toString());
		}
		return listDTO;
	}

	@Override
	public CategorieDTO findCategorieByIdProduit(Long idProduit) {
		//TODO
		// recherche d'une Categorie selon l'id produit (1 categorie unique par produit)
		Categorie dao = categorieDAO.findCategorieByByIdProduit(idProduit);
		CategorieDTO dto = null;
		if (dao != null) {
			// transfert DAO --> DTO
			dto = new CategorieDTO();
			ArrayList<ProduitDTO> lpDto = new ArrayList<ProduitDTO>();
			List<Produit> lp = dao.getProduits();
			if (lp != null) {
				for (Produit pr : lp) {
					ProduitDTO nProduitDTO = new ProduitDTO();
					BeanUtils.copyProperties (pr, nProduitDTO );
					lpDto.add(nProduitDTO);
					}
				}
			dto.setProduitsDTO(lpDto);
						
			BeanUtils.copyProperties(dao, dto);
			}
		return dto;
	}
	
}
